package com.my9yu.common.socket.filter.transience;

import java.util.Collection;

import org.apache.mina.core.session.IoSession;

import com.my9yu.common.socket.core.Request;

/**
 * 会话管理器接口
 * @author frank
 */
public interface TransientSessionManager {

	/**
	 * 获取指定用户标识的会话对象
	 * @param id 用户标识
	 * @return 会返回null，被延时关闭的会话也会返回
	 */
	TransientSession getSession(Object id);

	/**
	 * 向指定目标发送请求
	 * @param request
	 * @param ids
	 */
	void send(Request<?> request, Object... ids);

	/**
	 * 向指定目标发送请求
	 * @param request
	 * @param sessions
	 */
	void send(Request<?> request, TransientSession... sessions);

	/**
	 * 向所有已经验证身份的会话发送请求
	 * @param request
	 */
	void sendAllIdentified(Request<?> request);

	/**
	 * 检查指定用户是否在线
	 * @param ids 用户标识
	 * @return
	 */
	boolean isOnline(Object... ids);

	/**
	 * 获取全部的在线用户标识
	 * @return
	 */
	Collection<?> getOnlineIdentities();

	/**
	 * 获取全部的在线数量
	 * @return
	 */
	int getOnlineCount();

	/**
	 * 添加会话监听器，每一种事件类型的监听器只能添加一个
	 * @param listener 监听器实例
	 * @throws IllegalStateException 重复添加同一类型的监听器时抛出
	 */
	void addListener(TransientSessionListener listener);

	/**
	 * 踢指定的用户下线
	 * @param cause 原因标识{@link SessionEventCause}
	 * @param ids 被踢下线的用户标识
	 */
	Collection<?> kick(int cause, Object... ids);

	/**
	 * 将全部的在线用户踢下线
	 * @param cause 原因标识{@link SessionEventCause}
	 */
	Collection<?> kickAll(int cause);

	/**
	 * 设置会话身份
	 * @param session 来源对象
	 * @param id 玩家标识
	 * @param rebind 是否重新设置(不发出REPLACE和IDENTIFIED事件)
	 */
	TransientSession bind(Object id, IoSession ioSession, boolean rebind);

	/**
	 * 添加 SESSION 状态, 客户端根据状态请求相应数据
	 */
	void addAttachmentState(Object id, int state);

}
